import random
from faker import Faker


class FakerUtil:
    # 初始化Faker对象，使用中文语言环境
    faker = Faker("zh-CN")

    @classmethod
    def _get_unique_value(cls, method):
        """
        获取唯一值的内部方法
        :param method: Faker库中的方法名
        :return: 返回调用Faker库方法生成的唯一值，如果出现异常则返回None
        """
        try:
            # 使用getattr动态调用Faker库中的方法
            return getattr(cls.faker.unique, method)()
        except Exception as e:
            # 捕获并打印异常信息
            print(f"生成唯一值时出现异常: {e}")
            return ""

    # 随机生成用户名
    @classmethod
    def faker_user_name(cls) -> str:
        """
        :return: random generate unique username
        """
        return cls._get_unique_value("name") or ""

    # 随机生成手机号
    @classmethod
    def faker_phone_number(cls) -> str:
        return cls._get_unique_value("phone_number") or ""

    # 随机生成文本信息 max_nb_chars(最大字符长度)
    @classmethod
    def faker_random_text(cls, length: int = 20) -> str:
        """
        :param length: 默认字符串长度
        :return: 返回字符长度为 20 的随机文本
        """
        try:
            return cls.faker.text(max_nb_chars=length, ext_word_list=None)
        except Exception as e:
            print(f"生成随机文本时出现异常: {e}")
            return ""

    # 随机生成公司名称
    @classmethod
    def faker_company(cls) -> str:
        return cls._get_unique_value("company") or ""

    # 随机生成地址/住址信息
    @classmethod
    def faker_address(cls) -> str:
        try:
            return cls.faker.address()
        except Exception as e:
            print(f"生成地址时出现异常: {e}")
            return ""

    # 随机生成整数 0 或者 1
    @classmethod
    def random_generate_zero_or_one(cls) -> int:
        """
        :return: 随机生成整数 0 或者 1
        """
        try:
            return random.randint(0, 1)
        except Exception as e:
            print(f"生成 0 或 1 时出现异常: {e}")
            return 0

    # 随机生成 True 或者 False
    @classmethod
    def random_generate_true_or_false(cls) -> bool:
        """
        :return: 随机生成 True 或者 False
        """
        try:
            return bool(random.getrandbits(1))
        except Exception as e:
            print(f"生成布尔值时出现异常: {e}")
            return False

    # 随机生成邮箱
    @classmethod
    def faker_email(cls) -> str:
        """
        :return: 随机生成邮箱
        """
        return cls._get_unique_value("email")

    # 随机生成省份
    @classmethod
    def faker_province(cls) -> str:
        """
        :return: 随机生成 省份
        """
        try:
            return cls.faker.province()
        except AttributeError:
            print("Faker 库可能不支持 'province' 方法，请检查。")
            return ""
        except Exception as e:
            print(f"生成省份时出现异常: {e}")
            return ""

    # 随机生成职位
    @classmethod
    def faker_job(cls) -> str:
        """
        :return: 随机生成职位
        """
        try:
            return cls.faker.job()
        except Exception as e:
            print(f"生成职位时出现异常: {e}")
            return ""

    # 随机生成密码
    @classmethod
    def faker_password(cls, length: int = 8) -> str:
        """
        :return: 随机密码
        length 长度
        special_chars 特殊字符
        digits 数字
        upper_case 大写
        lower_case 小写
        """
        try:
            return cls.faker.unique.password(
                length,
                special_chars=True,
                digits=True,
                upper_case=True,
                lower_case=True,
            )
        except Exception as e:
            print(f"生成密码时出现异常: {e}")
            return ""

    # 随机生成字符串
    @classmethod
    def faker_string(cls) -> str:
        """
        :return: 随机生成字符串
        """
        return cls._get_unique_value("pystr") or ""

    # 随机生成范围内整数
    @classmethod
    def faker_number(cls, num_min: int, num_max: int) -> int:
        """
        :param num_min: 最小整数
        :param num_max: 最大整数
        :return: 随机生成 int 整数 范围：[最小整数, 最大整数]
        """
        try:
            return cls.faker.pyint(num_min, num_max)
        except Exception as e:
            print(f"生成随机整数时出现异常: {e}")
            return 0


if __name__ == "__main__":
    print(FakerUtil.faker_number(1, 10))
